import Logline from 'logline'
import axios from 'axios'
import config from '../assets/js/config'
import Vue from 'vue'
import qs from 'qs'

const utils = {
    /**
     * 设置页面title
     * **/
    setPageTitle: function (title) {
        if (title) {
            window.document.title = title
        }
    },
    /**
     * 日志工具
     * doc link：https://github.com/latel/logline
     * **/
    Logline: {
        // 设置日志
        setLog: function (modules, logtype, desc, data) {
            Logline.using(Logline.PROTOCOL.INDEXEDDB)
            if (!modules) {
                // 默认是接口请求的错误
                modules = 'api-request'
            }
            let logObj = new Logline(modules)
            switch (logtype) {
                case 'info':
                    logObj.info(desc)
                    break
                case 'error':
                    logObj.error(desc, data)
                    break
                case 'warning':
                    logObj.warning(desc)
                    break
                default:
                    logObj.error(desc, data)
            }
        },
        // 获取日志
        getLog: function (start, end, callback) {
            // start, end的单位为d，例如：1天-1d，半天-.5d，
            if (start && end) {
                // 获取start-end范围内的日志
                Logline.get(start, end, function (logs) {
                    if (callback) {
                        callback(logs)
                    } else {
                        console.log(logs)
                    }
                })
            } else if (start && !end) {
                // 获取start天内的日志
                Logline.get(start, function (logs) {
                    if (callback) {
                        callback(logs)
                    } else {
                        console.log(logs)
                    }
                })
            } else {
                // 获取所有日志
                Logline.all(function (logs) {
                    if (callback) {
                        callback(logs)
                    } else {
                        console.log(logs)
                    }
                })
            }
        },
        // 清除日志
        cleanLog: function () {
            Logline.clean()
        }
    },
    /**
     * 通用请求方法
     * @param params|Object|请求参数|eg: req = {
     *    ctxType: 'json' 请求头部 默认'json',
     *    headers: 头部信息
     *    data: {} 请求数据
     *    success: function () {} 请求成功code=0,
     *    fail: function () {} 请求失败code!=0,
     *    error: function () {} 网络问题请求失败（服务端问题）
     * }
     * **/
    sendReq: function (params) {
        let rConfig
        let data
        switch (params.req.ctxType) {
            case 'json':
                rConfig = config.axiosJsonConfig
                data = params.req.data
                break
            case 'formdata':
                rConfig = config.axiosFormDataConfig
                data = qs.stringify(params.req.data)
                break
            case 'file':
                rConfig = config.axiosMultiFormData
                data = params.req.data
                break
            default:
                rConfig = config.axiosJsonConfig
                data = params.req.data
                break
        }
        let headers = rConfig.headers
        for (let key in params.req.headers) {
            headers[key] = params.req.headers[key]
        }
        rConfig.headers = headers
        if (params.req.method === 'post') {
            axios.post(params.queryUrl, data, rConfig).then(function (res) {
                if (res.data.code === 200 || res.data.code || res.data.status) {
                    if (params.req.success) {
                        params.req.success(res)
                    } else {
                        console.log(res)
                    }
                } else {
                    utils.Logline.setLog('', 'error', 'api fail', {
                        errMsg: res.data.errors,
                        params: params,
                        res: res.data
                    })
                    if (params.req.fail) {
                        params.req.fail(res)
                    } else {
                        console.log(res)
                    }
                }
            }).catch(function (e) {
                utils.Logline.setLog('', 'error', 'request fail', {
                    errMsg: e.toString(),
                    params: params,
                    res: null
                })
                if (params.req.error) {
                    params.req.error(e)
                } else {
                    Vue.prototype.$message.error('请求接口失败，请检查网络')
                }
            })
        } else if (params.req.method === 'get') {
            axios.get(params.queryUrl, rConfig).then(function (res) {
                if (res.data.code === 0 || res.data.code || res.data.status) {
                    if (params.req.success) {
                        params.req.success(res)
                    } else {
                        console.log(res)
                    }
                } else {
                    utils.Logline.setLog('', 'error', 'api fail', {
                        errMsg: res.data.errors,
                        params: params,
                        res: res.data
                    })
                    if (params.req.fail) {
                        params.req.fail(res)
                    } else {
                        console.log(res)
                    }
                }
            }).catch(function (e) {
                utils.Logline.setLog('', 'error', 'request fail', {
                    errMsg: e.toString(),
                    params: params,
                    res: null
                })
                if (params.req.error) {
                    params.req.error(e)
                } else {
                    Vue.prototype.$message.error('请求接口失败，请检查网络')
                }
            })
        } else if (params.req.method === 'put') {
            axios.put(params.queryUrl, data, rConfig).then(function (res) {
                if (res.data.code === 0 || res.data.code || res.data.status) {
                    if (params.req.success) {
                        params.req.success(res)
                    } else {
                        console.log(res)
                    }
                } else {
                    utils.Logline.setLog('', 'error', 'api fail', {
                        errMsg: res.data.errors,
                        params: params,
                        res: res.data
                    })
                    if (params.req.fail) {
                        params.req.fail(res)
                    } else {
                        console.log(res)
                    }
                }
            }).catch(function (e) {
                utils.Logline.setLog('', 'error', 'request fail', {
                    errMsg: e.toString(),
                    params: params,
                    res: null
                })
                if (params.req.error) {
                    params.req.error(e)
                } else {
                    Vue.prototype.$message.error('请求接口失败，请检查网络')
                }
            })
        } else if (params.req.method === 'delete') {
            axios.delete(params.queryUrl, rConfig).then(function (res) {
                if (res.data.code === 0 || res.data.code || res.data.status) {
                    if (params.req.success) {
                        params.req.success(res)
                    } else {
                        console.log(res)
                    }
                } else {
                    utils.Logline.setLog('', 'error', 'api fail', {
                        errMsg: res.data.errors,
                        params: params,
                        res: res.data
                    })
                    if (params.req.fail) {
                        params.req.fail(res)
                    } else {
                        console.log(res)
                    }
                }
            }).catch(function (e) {
                utils.Logline.setLog('', 'error', 'request fail', {
                    errMsg: e.toString(),
                    params: params,
                    res: null
                })
                if (params.req.error) {
                    params.req.error(e)
                } else {
                    Vue.prototype.$message.error('请求接口失败，请检查网络')
                }
            })
        }
    }
}
//请求拦截器
axios.interceptors.request.use(res =>{
    if (window.sessionStorage.getItem('token')){
        res.headers['Authorization'] = window.sessionStorage.getItem('token');
    }
    return res;
},error => {
    console.log(error);
})

export default utils
